{ "cells": [ { "cell_type": "markdown", "metadata": { "school_cell_uuid": "83a5dc84908a47c89462de881b5eb17c" }, "source": [ "# 4.5 데이터프레임 인덱스 조작" ] }, { "cell_type": "markdown", "metadata": { "school_cell_uuid": "5b8a7444f43c480ba18ec7ff4bbe3dc6" }, "source": [ "## 데이터프레임 인덱스 설정 및 제거" ] }, { "cell_type": "markdown", "metadata": { "school_cell_uuid": "1a2853c8796d4cb0a17a3cde44ce7580" }, "source": [ "때로는 데이터프레임에 인덱스로 들어가 있어야 할 데이터가 일반 데이터 열에 들어가 있거나 반대로 일반 데이터 열이어야 할 것이 인덱스로 되어 있을 수 있다. 이 때는 `set_index` 명령이나 `reset_index` 명령으로 인덱스와 일반 데이터 열을 교환할 수 있다.\n", "\n", "* `set_index` : 기존의 행 인덱스를 제거하고 데이터 열 중 하나를 인덱스로 설정\n", "* `reset_index` : 기존의 행 인덱스를 제거하고 인덱스를 데이터 열로 추가" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "school_cell_uuid": "fcede1948a384f49872e20d8b5189d0a" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
C1C2C3C4
0A0.550.650.79
1B0.720.440.53
2C0.60.890.57
3D0.540.960.93
4E0.420.380.07
\n", "
" ], "text/plain": [ " C1 C2 C3 C4\n", "0 A 0.55 0.65 0.79\n", "1 B 0.72 0.44 0.53\n", "2 C 0.6 0.89 0.57\n", "3 D 0.54 0.96 0.93\n", "4 E 0.42 0.38 0.07" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.seed(0)\n", "df1 = pd.DataFrame(np.vstack([list('ABCDE'),\n", " np.round(np.random.rand(3, 5), 2)]).T,\n", " columns=[\"C1\", \"C2\", \"C3\", \"C4\"])\n", "df1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```{margin}\n", "`set_index`\n", "```" ] }, { "cell_type": "markdown", "metadata": { "school_cell_uuid": "34135321278a4a5bb52b17a4dd031a17" }, "source": [ "`set_index` 메서드로 특정한 열을 인덱스로 설정할 수 있다. 이 때 기존의 인덱스는 없어진다." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "school_cell_uuid": "4c416569dec34d678bcb2cc4f86569a1" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
C2C3C4
C1
A0.550.650.79
B0.720.440.53
C0.60.890.57
D0.540.960.93
E0.420.380.07
\n", "
" ], "text/plain": [ " C2 C3 C4\n", "C1 \n", "A 0.55 0.65 0.79\n", "B 0.72 0.44 0.53\n", "C 0.6 0.89 0.57\n", "D 0.54 0.96 0.93\n", "E 0.42 0.38 0.07" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2 = df1.set_index(\"C1\")\n", "df2" ] }, { "cell_type": "markdown", "metadata": { "school_cell_uuid": "f1f1dcb4f40c407bb157b7d56af89709" }, "source": [ "마찬가지로 C2열을 인덱스로 지정하면 기존의 인덱스는 사라진다." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "school_cell_uuid": "fb681e62abb54f61877bc3e58d400098" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
C3C4
C2
0.550.650.79
0.720.440.53
0.60.890.57
0.540.960.93
0.420.380.07
\n", "
" ], "text/plain": [ " C3 C4\n", "C2 \n", "0.55 0.65 0.79\n", "0.72 0.44 0.53\n", "0.6 0.89 0.57\n", "0.54 0.96 0.93\n", "0.42 0.38 0.07" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.set_index(\"C2\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```{margin}\n", "`reset_index`\n", "```" ] }, { "cell_type": "markdown", "metadata": { "school_cell_uuid": "7f70297137b34365a5c2eedb16af1ee5" }, "source": [ "반대로 `reset_index` 메서드를 쓰면 인덱스를 보통의 자료열로 바꿀 수도 있다. 이 때 인덱스 열은 자료열의 가장 선두로 삽입된다. 데이터프레임의 인덱스는 정수로 된 디폴트 인덱스로 바뀐다." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "school_cell_uuid": "9e02d2e2d00f49be9edb6d726e100d8c" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
C1C2C3C4
0A0.550.650.79
1B0.720.440.53
2C0.60.890.57
3D0.540.960.93
4E0.420.380.07
\n", "
" ], "text/plain": [ " C1 C2 C3 C4\n", "0 A 0.55 0.65 0.79\n", "1 B 0.72 0.44 0.53\n", "2 C 0.6 0.89 0.57\n", "3 D 0.54 0.96 0.93\n", "4 E 0.42 0.38 0.07" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.reset_index()" ] }, { "cell_type": "markdown", "metadata": { "school_cell_uuid": "ef36cbec78054e9a8b546fae48404637" }, "source": [ "`reset_index` 메서드를 호출할 때 인수 `drop=True` 로 설정하면 인덱스 열을 보통의 자료열로 올리는 것이 아니라 그냥 버리게 된다." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "school_cell_uuid": "fe4ed95e84e94338a8e3b6620aebc533" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
C2C3C4
00.550.650.79
10.720.440.53
20.60.890.57
30.540.960.93
40.420.380.07
\n", "
" ], "text/plain": [ " C2 C3 C4\n", "0 0.55 0.65 0.79\n", "1 0.72 0.44 0.53\n", "2 0.6 0.89 0.57\n", "3 0.54 0.96 0.93\n", "4 0.42 0.38 0.07" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.reset_index(drop=True)" ] }, { "cell_type": "markdown", "metadata": { "bootstrap": { "panel": { "class": "panel-default" } }, "school_cell_uuid": "f0df724ef2b74bc29190c2a96a96f6a9" }, "source": [ "````{admonition} 연습 문제 4.5.1\n", "\n", "5명의 학생의 국어, 영어, 수학 점수를 나타내는 데이터프레임을 다음과 같이 만든다.\n", "\n", "1. 학생 이름을 나타내는 열을 포함시키지 않고 데이터프레임 `df_score1` 을 생성한 후, `df_score1.index` 속성에 학생 이름을 나타내는 열을 지정하여 인덱스를 지정한다. `reset_index` 명령으로 이 인덱스 열을 명령으로 일반 데이터열로 바꾸여 데이터프레임 `df_score2`을 만든다.\n", "2. 학생 이름을 나타내는 열이 일반 데이터 열을 포함하는 데이터프레임 `df_score2`에 `set_index` 명령을 적용하여 다시 학생 이름을 나타내는 열을 인덱스로 변경한다.\n", "````" ] }, { "cell_type": "markdown", "metadata": { "school_cell_uuid": "d4342aa06a5f4850948afb26abcd0f89" }, "source": [ "## 다중 인덱스" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```{margin}\n", "다중 인덱스(multi-index)\n", "```" ] }, { "cell_type": "markdown", "metadata": { "school_cell_uuid": "c833059822bd43eb84061e00bb689c2f" }, "source": [ "행이나 열에 여러 계층을 가지는 인덱스 즉, 다중 인덱스(multi-index)를 설정할 수도 있다. 데이터프레임을 생성할 때 `columns` 인수에 다음 예제처럼 리스트의 리스트(행렬) 형태로 인덱스를 넣으면 다중 열 인덱스를 가지게 된다." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "school_cell_uuid": "e73724b1d28046b68fa2ea7388b3adf0" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
C1C2C1C2
01.760.400.982.24
11.87-0.980.95-0.15
2-0.100.410.141.45
30.760.120.440.33
41.49-0.210.31-0.85
\n", "
" ], "text/plain": [ " A B \n", " C1 C2 C1 C2\n", "0 1.76 0.40 0.98 2.24\n", "1 1.87 -0.98 0.95 -0.15\n", "2 -0.10 0.41 0.14 1.45\n", "3 0.76 0.12 0.44 0.33\n", "4 1.49 -0.21 0.31 -0.85" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.seed(0)\n", "df3 = pd.DataFrame(np.round(np.random.randn(5, 4), 2),\n", " columns=[[\"A\", \"A\", \"B\", \"B\"],\n", " [\"C1\", \"C2\", \"C1\", \"C2\"]])\n", "df3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```{margin}\n", "`columns.names`\n", "```" ] }, { "cell_type": "markdown", "metadata": { "school_cell_uuid": "d891323964624c1f9a284c1d0af5af64" }, "source": [ "다중 인덱스는 이름을 지정하면 더 편리하게 사용할 수 있다. 열 인덱스들의 이름 지정은 `columns` 객체의 `names` 속성에 리스트를 넣어서 지정한다." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "school_cell_uuid": "2b23c3ed18fd402d80f81cbe1b8ac28c" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Cidx1AB
Cidx2C1C2C1C2
01.760.400.982.24
11.87-0.980.95-0.15
2-0.100.410.141.45
30.760.120.440.33
41.49-0.210.31-0.85
\n", "
" ], "text/plain": [ "Cidx1 A B \n", "Cidx2 C1 C2 C1 C2\n", "0 1.76 0.40 0.98 2.24\n", "1 1.87 -0.98 0.95 -0.15\n", "2 -0.10 0.41 0.14 1.45\n", "3 0.76 0.12 0.44 0.33\n", "4 1.49 -0.21 0.31 -0.85" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df3.columns.names = [\"Cidx1\", \"Cidx2\"]\n", "df3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```{margin}\n", "`index.names`\n", "```" ] }, { "cell_type": "markdown", "metadata": { "school_cell_uuid": "e0ee64907c1a413fa25db2ac800340ac" }, "source": [ "마찬가지로 데이터프레임을 생성할 때 `index` 인수에 리스트의 리스트(행렬) 형태로 인덱스를 넣으면 다중 (행) 인덱스를 가진다. 행 인덱스들의 이름 지정은 `index` 객체의 `names` 속성에 리스트를 넣어서 지정한다." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "school_cell_uuid": "c6d2c389122043e8ae3c8bf2e2ed6274" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Cidx1AB
Cidx2CDCD
Ridx1Ridx2
Mid_11.760.400.982.24
id_21.87-0.980.95-0.15
id_3-0.100.410.141.45
Fid_10.760.120.440.33
id_21.49-0.210.31-0.85
id_3-2.550.650.86-0.74
\n", "
" ], "text/plain": [ "Cidx1 A B \n", "Cidx2 C D C D\n", "Ridx1 Ridx2 \n", "M id_1 1.76 0.40 0.98 2.24\n", " id_2 1.87 -0.98 0.95 -0.15\n", " id_3 -0.10 0.41 0.14 1.45\n", "F id_1 0.76 0.12 0.44 0.33\n", " id_2 1.49 -0.21 0.31 -0.85\n", " id_3 -2.55 0.65 0.86 -0.74" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.seed(0)\n", "df4 = pd.DataFrame(np.round(np.random.randn(6, 4), 2),\n", " columns=[[\"A\", \"A\", \"B\", \"B\"],\n", " [\"C\", \"D\", \"C\", \"D\"]],\n", " index=[[\"M\", \"M\", \"M\", \"F\", \"F\", \"F\"],\n", " [\"id_\" + str(i + 1) for i in range(3)] * 2])\n", "df4.columns.names = [\"Cidx1\", \"Cidx2\"]\n", "df4.index.names = [\"Ridx1\", \"Ridx2\"]\n", "df4" ] }, { "cell_type": "markdown", "metadata": { "school_cell_uuid": "aed06e2ba78d4092ae9956946788dd96" }, "source": [ "## 행 인덱스와 열 인덱스 교환" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```{margin}\n", "`stack`\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```{margin}\n", "`unstack`\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`stack` 메서드나 `unstack` 메서드를 쓰면 열 인덱스를 행 인덱스로 바꾸거나 반대로 행 인덱스를 열 인덱스로 바꿀 수 있다.\n", "\n", "* `stack`\n", " * 열 인덱스 -> 행 인덱스로 변환\n", "\n", "* `unstack`\n", " * 행 인덱스 -> 열 인덱스로 변환\n", "\n", "`stack` 메서드를 실행하면 열 인덱스가 반시계 방향으로 90도 회전한 것과 비슷한 모양이 된다. 마찬가지로 `unstack` 메서드를 실행하면 행 인덱스가 시계 방향으로 90도 회전한 것과 비슷하다. 인덱스를 지정할 때는 문자열 이름과 순서를 표시하는 숫자 인덱스를 모두 사용할 수 있다." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "school_cell_uuid": "1295839048044d02bdb3ba2f8f288b4a" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Cidx2CD
Ridx1Ridx2Cidx1
Mid_1A1.760.40
B0.982.24
id_2A1.87-0.98
B0.95-0.15
id_3A-0.100.41
B0.141.45
Fid_1A0.760.12
B0.440.33
id_2A1.49-0.21
B0.31-0.85
id_3A-2.550.65
B0.86-0.74
\n", "
" ], "text/plain": [ "Cidx2 C D\n", "Ridx1 Ridx2 Cidx1 \n", "M id_1 A 1.76 0.40\n", " B 0.98 2.24\n", " id_2 A 1.87 -0.98\n", " B 0.95 -0.15\n", " id_3 A -0.10 0.41\n", " B 0.14 1.45\n", "F id_1 A 0.76 0.12\n", " B 0.44 0.33\n", " id_2 A 1.49 -0.21\n", " B 0.31 -0.85\n", " id_3 A -2.55 0.65\n", " B 0.86 -0.74" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df4.stack(\"Cidx1\")" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "school_cell_uuid": "0c99952259c24011a4486346515006fa" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Cidx1AB
Ridx1Ridx2Cidx2
Mid_1C1.760.98
D0.402.24
id_2C1.870.95
D-0.98-0.15
id_3C-0.100.14
D0.411.45
Fid_1C0.760.44
D0.120.33
id_2C1.490.31
D-0.21-0.85
id_3C-2.550.86
D0.65-0.74
\n", "
" ], "text/plain": [ "Cidx1 A B\n", "Ridx1 Ridx2 Cidx2 \n", "M id_1 C 1.76 0.98\n", " D 0.40 2.24\n", " id_2 C 1.87 0.95\n", " D -0.98 -0.15\n", " id_3 C -0.10 0.14\n", " D 0.41 1.45\n", "F id_1 C 0.76 0.44\n", " D 0.12 0.33\n", " id_2 C 1.49 0.31\n", " D -0.21 -0.85\n", " id_3 C -2.55 0.86\n", " D 0.65 -0.74" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df4.stack(1)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "school_cell_uuid": "4b346e2d51bf49fba93f2810d0b9d71e" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Cidx1AB
Cidx2CDCD
Ridx2id_1id_2id_3id_1id_2id_3id_1id_2id_3id_1id_2id_3
Ridx1
F0.761.49-2.550.12-0.210.650.440.310.860.33-0.85-0.74
M1.761.87-0.100.40-0.980.410.980.950.142.24-0.151.45
\n", "
" ], "text/plain": [ "Cidx1 A B \n", "Cidx2 C D C D \n", "Ridx2 id_1 id_2 id_3 id_1 id_2 id_3 id_1 id_2 id_3 id_1 id_2 id_3\n", "Ridx1 \n", "F 0.76 1.49 -2.55 0.12 -0.21 0.65 0.44 0.31 0.86 0.33 -0.85 -0.74\n", "M 1.76 1.87 -0.10 0.40 -0.98 0.41 0.98 0.95 0.14 2.24 -0.15 1.45" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df4.unstack(\"Ridx2\")" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "school_cell_uuid": "da7558b565e64844bcc3b504780ef641" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Cidx1AB
Cidx2CDCD
Ridx1FMFMFMFM
Ridx2
id_10.761.760.120.400.440.980.332.24
id_21.491.87-0.21-0.980.310.95-0.85-0.15
id_3-2.55-0.100.650.410.860.14-0.741.45
\n", "
" ], "text/plain": [ "Cidx1 A B \n", "Cidx2 C D C D \n", "Ridx1 F M F M F M F M\n", "Ridx2 \n", "id_1 0.76 1.76 0.12 0.40 0.44 0.98 0.33 2.24\n", "id_2 1.49 1.87 -0.21 -0.98 0.31 0.95 -0.85 -0.15\n", "id_3 -2.55 -0.10 0.65 0.41 0.86 0.14 -0.74 1.45" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df4.unstack(0)" ] }, { "cell_type": "markdown", "metadata": { "school_cell_uuid": "2da6e7292c8646bdbf967fbe1978b8e5" }, "source": [ "## 다중 인덱스가 있는 경우의 인덱싱" ] }, { "cell_type": "markdown", "metadata": { "school_cell_uuid": "558483efb47643ee825eadf1f665a557" }, "source": [ "데이터프레임이 다중 인덱스를 가지는 경우에는 인덱스 값이 하나의 라벨이나 숫자가 아니라 `()`로 둘러싸인 튜플이 되어야 한다. 예를 들어 앞에서 만든 `df3` 데이터프레임의 경우 다음과 같이 인덱싱할 수 있다." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "school_cell_uuid": "690251593fe5453bbec4f171f7abf140" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Cidx1AB
Cidx2C1C2C1C2
01.760.400.982.24
11.87-0.980.95-0.15
2-0.100.410.141.45
30.760.120.440.33
41.49-0.210.31-0.85
\n", "
" ], "text/plain": [ "Cidx1 A B \n", "Cidx2 C1 C2 C1 C2\n", "0 1.76 0.40 0.98 2.24\n", "1 1.87 -0.98 0.95 -0.15\n", "2 -0.10 0.41 0.14 1.45\n", "3 0.76 0.12 0.44 0.33\n", "4 1.49 -0.21 0.31 -0.85" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df3" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "school_cell_uuid": "fcf31bd4ec4c4421839fb5c77f5f17f9" }, "outputs": [ { "data": { "text/plain": [ "0 0.98\n", "1 0.95\n", "2 0.14\n", "3 0.44\n", "4 0.31\n", "Name: (B, C1), dtype: float64" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df3[(\"B\", \"C1\")]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`loc` 인덱스를 사용하는 경우에도 마찬가지로 튜플을 써야 한다." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "school_cell_uuid": "0cf4e403fb0848708c48e7acdd633955" }, "outputs": [ { "data": { "text/plain": [ "0.98" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df3.loc[0, (\"B\", \"C1\")]" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "school_cell_uuid": "94156e9adbdd4aadabdf722f14b3f3a2" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Cidx1AB
Cidx2C1C2C1C2
01.760.40100.002.24
11.87-0.980.95-0.15
2-0.100.410.141.45
30.760.120.440.33
41.49-0.210.31-0.85
\n", "
" ], "text/plain": [ "Cidx1 A B \n", "Cidx2 C1 C2 C1 C2\n", "0 1.76 0.40 100.00 2.24\n", "1 1.87 -0.98 0.95 -0.15\n", "2 -0.10 0.41 0.14 1.45\n", "3 0.76 0.12 0.44 0.33\n", "4 1.49 -0.21 0.31 -0.85" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df3.loc[0, (\"B\", \"C1\")] = 100\n", "df3" ] }, { "cell_type": "markdown", "metadata": { "school_cell_uuid": "8cee7191986c4c6f90677743bad49106" }, "source": [ "단, `iloc` 인덱서를 사용하는 경우에는 튜플 형태의 다중인덱스를 사용할 수 없다." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "school_cell_uuid": "0cf4e403fb0848708c48e7acdd633955" }, "outputs": [ { "data": { "text/plain": [ "100.0" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df3.iloc[0, 2]" ] }, { "cell_type": "markdown", "metadata": { "school_cell_uuid": "1e092e6729744d8b97e979f9be535788" }, "source": [ "만약 하나의 레벨 값만 넣으면 다중 인덱스 중에서 가장 상위의 값을 지정한 것으로 본다." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "school_cell_uuid": "ce3b39e0c6c84018946f7a0a1d0304b9" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Cidx2C1C2
01.760.40
11.87-0.98
2-0.100.41
30.760.12
41.49-0.21
\n", "
" ], "text/plain": [ "Cidx2 C1 C2\n", "0 1.76 0.40\n", "1 1.87 -0.98\n", "2 -0.10 0.41\n", "3 0.76 0.12\n", "4 1.49 -0.21" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df3['A']" ] }, { "cell_type": "markdown", "metadata": { "school_cell_uuid": "d89a583656e64321ab2bc8169e885418" }, "source": [ "`df4` 데이터프레임은 다음과 같이 인덱싱할 수 있다." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "school_cell_uuid": "1f6fae72c59b4c9b983c16ee3c459264" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Cidx1AB
Cidx2CDCD
Ridx1Ridx2
Mid_11.760.400.982.24
id_21.87-0.980.95-0.15
id_3-0.100.410.141.45
Fid_10.760.120.440.33
id_21.49-0.210.31-0.85
id_3-2.550.650.86-0.74
\n", "
" ], "text/plain": [ "Cidx1 A B \n", "Cidx2 C D C D\n", "Ridx1 Ridx2 \n", "M id_1 1.76 0.40 0.98 2.24\n", " id_2 1.87 -0.98 0.95 -0.15\n", " id_3 -0.10 0.41 0.14 1.45\n", "F id_1 0.76 0.12 0.44 0.33\n", " id_2 1.49 -0.21 0.31 -0.85\n", " id_3 -2.55 0.65 0.86 -0.74" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df4" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "school_cell_uuid": "9b1a4ac9834b4b7795346b626a08247c" }, "outputs": [ { "data": { "text/plain": [ "1.76" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df4.loc[(\"M\", \"id_1\"), (\"A\", \"C\")]" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "school_cell_uuid": "f715557b7990471bb9d4df2c28ea6171" }, "outputs": [ { "data": { "text/plain": [ "Ridx1 Ridx2\n", "M id_1 1.76\n", " id_2 1.87\n", " id_3 -0.10\n", "F id_1 0.76\n", " id_2 1.49\n", " id_3 -2.55\n", "Name: (A, C), dtype: float64" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df4.loc[:, (\"A\", \"C\")]" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "school_cell_uuid": "869e3265ef564639b8cf720f00b30da9" }, "outputs": [ { "data": { "text/plain": [ "Cidx1 Cidx2\n", "A C 1.76\n", " D 0.40\n", "B C 0.98\n", " D 2.24\n", "Name: (M, id_1), dtype: float64" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df4.loc[(\"M\", \"id_1\"), :]" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "school_cell_uuid": "7c98b82edf604573bc4db1b71f8e7fb4" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Cidx1AB
Cidx2CDCD
Ridx1Ridx2
Mid_11.760.400.982.24
id_21.87-0.980.95-0.15
id_3-0.100.410.141.45
Fid_10.760.120.440.33
id_21.49-0.210.31-0.85
id_3-2.550.650.86-0.74
AllAll3.230.393.682.28
\n", "
" ], "text/plain": [ "Cidx1 A B \n", "Cidx2 C D C D\n", "Ridx1 Ridx2 \n", "M id_1 1.76 0.40 0.98 2.24\n", " id_2 1.87 -0.98 0.95 -0.15\n", " id_3 -0.10 0.41 0.14 1.45\n", "F id_1 0.76 0.12 0.44 0.33\n", " id_2 1.49 -0.21 0.31 -0.85\n", " id_3 -2.55 0.65 0.86 -0.74\n", "All All 3.23 0.39 3.68 2.28" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df4.loc[(\"All\", \"All\"), :] = df4.sum()\n", "df4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`loc`를 사용하는 경우에도 튜플이 아닌 하나의 값만 쓰면 가장 상위의 인덱스를 지정한 것과 같다." ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Cidx1AB
Cidx2CDCD
Ridx2
id_11.760.400.982.24
id_21.87-0.980.95-0.15
id_3-0.100.410.141.45
\n", "
" ], "text/plain": [ "Cidx1 A B \n", "Cidx2 C D C D\n", "Ridx2 \n", "id_1 1.76 0.40 0.98 2.24\n", "id_2 1.87 -0.98 0.95 -0.15\n", "id_3 -0.10 0.41 0.14 1.45" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df4.loc[\"M\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```{margin}\n", "`slice(None)`\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "특정 레벨의 모든 인덱스 값을 인덱싱할 때는 슬라이스를 사용한다. 다만 다중 인덱스의 튜플 내에서는 `:` 슬라이스 기호를 사용할 수 없고 대신 `slice(None)` 값을 사용해야 한다." ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Cidx1AB
Cidx2CDCD
Ridx1Ridx2
Mid_11.760.400.982.24
id_21.87-0.980.95-0.15
id_3-0.100.410.141.45
\n", "
" ], "text/plain": [ "Cidx1 A B \n", "Cidx2 C D C D\n", "Ridx1 Ridx2 \n", "M id_1 1.76 0.40 0.98 2.24\n", " id_2 1.87 -0.98 0.95 -0.15\n", " id_3 -0.10 0.41 0.14 1.45" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df4.loc[(\"M\", slice(None)), :]" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Cidx1AB
Cidx2CDCD
Ridx1Ridx2
Mid_11.760.400.982.24
Fid_10.760.120.440.33
\n", "
" ], "text/plain": [ "Cidx1 A B \n", "Cidx2 C D C D\n", "Ridx1 Ridx2 \n", "M id_1 1.76 0.40 0.98 2.24\n", "F id_1 0.76 0.12 0.44 0.33" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df4.loc[(slice(None), \"id_1\"), :]" ] }, { "cell_type": "markdown", "metadata": { "school_cell_uuid": "ed11c61a050749ee896136c7442c5c87" }, "source": [ "## 다중 인덱스의 인덱스 순서 교환" ] }, { "cell_type": "markdown", "metadata": { "school_cell_uuid": "d6088973fa014247bd9fedaa69edc8cd" }, "source": [ "다중 인덱스의 인덱스 순서를 바꾸고 싶으면 `swaplevel` 명령을 사용한다.\n", "\n", "* `swaplevel(i, j, axis)`\n", "\n", "`i`와 `j`는 교환하고자 하는 인덱스 라벨(혹은 인덱스 번호)이고 `axis`는 0일 때 행 인덱스, 1일 때 열 인덱스를 뜻한다. 디폴트는 행 인덱스이다." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "school_cell_uuid": "8e76d407781b4d73a6d36dc8ec749ecd" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Cidx1AB
Cidx2CDCD
Ridx2Ridx1
id_1M1.760.400.982.24
id_2M1.87-0.980.95-0.15
id_3M-0.100.410.141.45
id_1F0.760.120.440.33
id_2F1.49-0.210.31-0.85
id_3F-2.550.650.86-0.74
AllAll3.230.393.682.28
\n", "
" ], "text/plain": [ "Cidx1 A B \n", "Cidx2 C D C D\n", "Ridx2 Ridx1 \n", "id_1 M 1.76 0.40 0.98 2.24\n", "id_2 M 1.87 -0.98 0.95 -0.15\n", "id_3 M -0.10 0.41 0.14 1.45\n", "id_1 F 0.76 0.12 0.44 0.33\n", "id_2 F 1.49 -0.21 0.31 -0.85\n", "id_3 F -2.55 0.65 0.86 -0.74\n", "All All 3.23 0.39 3.68 2.28" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df5 = df4.swaplevel(\"Ridx1\", \"Ridx2\")\n", "df5" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "school_cell_uuid": "956da57bb9f54938b4dbf1839c44b54a" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Cidx2CDCD
Cidx1AABB
Ridx1Ridx2
Mid_11.760.400.982.24
id_21.87-0.980.95-0.15
id_3-0.100.410.141.45
Fid_10.760.120.440.33
id_21.49-0.210.31-0.85
id_3-2.550.650.86-0.74
AllAll3.230.393.682.28
\n", "
" ], "text/plain": [ "Cidx2 C D C D\n", "Cidx1 A A B B\n", "Ridx1 Ridx2 \n", "M id_1 1.76 0.40 0.98 2.24\n", " id_2 1.87 -0.98 0.95 -0.15\n", " id_3 -0.10 0.41 0.14 1.45\n", "F id_1 0.76 0.12 0.44 0.33\n", " id_2 1.49 -0.21 0.31 -0.85\n", " id_3 -2.55 0.65 0.86 -0.74\n", "All All 3.23 0.39 3.68 2.28" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df6 = df4.swaplevel(\"Cidx1\", \"Cidx2\", 1)\n", "df6" ] }, { "cell_type": "markdown", "metadata": { "school_cell_uuid": "dacaf71abc42480585afd9b083fd7967" }, "source": [ "## 다중 인덱스가 있는 경우의 정렬" ] }, { "cell_type": "markdown", "metadata": { "school_cell_uuid": "9d12bd7d87844f40908c6aed96268938" }, "source": [ "다중 인덱스가 있는 데이터프레임을 `sort_index`로 정렬할 때는 `level` 인수를 사용하여 어떤 인덱스를 기준으로 정렬하는지 알려주어야 한다." ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "school_cell_uuid": "f4a968f72392416dacc8998634774450" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Cidx1AB
Cidx2CDCD
Ridx2Ridx1
AllAll3.230.393.682.28
id_1F0.760.120.440.33
M1.760.400.982.24
id_2F1.49-0.210.31-0.85
M1.87-0.980.95-0.15
id_3F-2.550.650.86-0.74
M-0.100.410.141.45
\n", "
" ], "text/plain": [ "Cidx1 A B \n", "Cidx2 C D C D\n", "Ridx2 Ridx1 \n", "All All 3.23 0.39 3.68 2.28\n", "id_1 F 0.76 0.12 0.44 0.33\n", " M 1.76 0.40 0.98 2.24\n", "id_2 F 1.49 -0.21 0.31 -0.85\n", " M 1.87 -0.98 0.95 -0.15\n", "id_3 F -2.55 0.65 0.86 -0.74\n", " M -0.10 0.41 0.14 1.45" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df5.sort_index(level=0)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "school_cell_uuid": "9a35b2296676451b87134cd952bfbc9c" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Cidx2CD
Cidx1ABAB
Ridx1Ridx2
Mid_11.760.980.402.24
id_21.870.95-0.98-0.15
id_3-0.100.140.411.45
Fid_10.760.440.120.33
id_21.490.31-0.21-0.85
id_3-2.550.860.65-0.74
AllAll3.233.680.392.28
\n", "
" ], "text/plain": [ "Cidx2 C D \n", "Cidx1 A B A B\n", "Ridx1 Ridx2 \n", "M id_1 1.76 0.98 0.40 2.24\n", " id_2 1.87 0.95 -0.98 -0.15\n", " id_3 -0.10 0.14 0.41 1.45\n", "F id_1 0.76 0.44 0.12 0.33\n", " id_2 1.49 0.31 -0.21 -0.85\n", " id_3 -2.55 0.86 0.65 -0.74\n", "All All 3.23 3.68 0.39 2.28" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df6.sort_index(axis=1, level=0)" ] }, { "cell_type": "markdown", "metadata": { "bootstrap": { "panel": { "class": "panel-default" } }, "school_cell_uuid": "87e3fb8db04a4ad48c9f3acae5b2a68f" }, "source": [ "````{admonition} 연습 문제 4.5.2\n", "\n", "A 반 학생 5명과 B반 학생 5명의 국어, 영어, 수학 점수를 나타내는 데이터프레임을 다음과 같이 만든다.\n", "\n", "1. \"반\", \"번호\", \"국어\", \"영어\", \"수학\" 을 열로 가지는 데이터프레임 `df_score3`을 만든다.\n", "\n", "2. `df_score3`을 변형하여 1차 행 인덱스로 \"반\"을 2차 행 인덱스로 \"번호\"을 가지는 데이터프레임 `df_score4`을 만든다.\n", "\n", "3. 데이터 프레임 `df_score4`에 각 학생의 평균을 나타내는 행을 오른쪽에 추가한다.\n", "\n", "4. `df_score3`을 변형하여 행 인덱스로 \"번호\"를, 1차 열 인덱스로 \"국어\", \"영어\", \"수학\"을, 2차 열 인덱스로 \"반\"을 가지는 데이터프레임 `df_score5`을 만든다.\n", "\n", "5. 데이터 프레임 `df_score5`에 각 반별 각 과목의 평균을 나타내는 행을 아래에 추가한다.\n", "\n", "````" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "celltoolbar": "Edit Metadata", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autoclose": false, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false } }, "nbformat": 4, "nbformat_minor": 4 }